import express from "express";
const app = express();
//中间件 所有请求都会先经过这个中间件
app.use("*", (req, res, next) => {
  //"*"允许所有资源访问 如果接口支持session 获取不到session
  //"origin"允许指定域名访问 指定ip网址 更加安全
  res.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500"); //"*"| "origin"
  //默认只支持get post head 其他的需要配置
  res.setHeader(
    "Access-Control-Allow-Methods",
    "GET, POST, OPTIONS, PUT, PATCH, DELETE"
  );
  //支持application/json
  //Access-Control-Allow-Headers 允许的请求头，自定义的请求头
  res.setHeader("Access-Control-Allow-Headers", "Content-Type");
  next();
});
//预检请求 OPTIONS 请求 这个东西是浏览器发起的
//需要满足以下条件才会发起
//1.Content-Type 请求头中必须包含application/json
//2.或者自定义请求头
//3.请求方法必须为PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH（非普通请求）
//自定义响应头 设置、获取
app.get("/info", (req, res) => {
  res.set("cqj", "123"); //自定义响应头 需要暴露出去
  res.setHeader("Access-Control-Expose-Headers", "cqj"); //后端必须暴露出去，否则前端拿到的是null
  res.json({
    code: 200,
    type: "get1",
  });
});
/**
 * 全双工通讯 双向通信
 * websocket 实时通讯的，前端和后端可以互相实时发送消息
 *
 * 单工通讯 只能单向发送消息
 * 使用场景：大屏项目 后端需要实时返回数据 前端不需要传参数 SSE(server send event 服务器发送事件)
 * 后端可以实时给前端返回 ，前端不可以给后端实时操作
 */
app.get("/sse", (req, res) => {
  //通过res.setHeader将Content-Type设置为text/event-stream
  res.setHeader("Content-Type", "text/event-stream");
  setInterval(() => {
    //自定义事件名
    res.write("event: test-name\n"); //默认是message
    //自定义数据格式
    res.write("data: " + Date.now() + "\n\n"); //发送消息
  }, 1000);
});
app.post("/info", (req, res) => {
  res.json({
    code: 200,
    type: "post",
  });
});
//get post put delete patch
app.patch("/info", (req, res) => {
  res.json({
    code: 200,
    type: "patch",
  });
});
app.listen(3001, () => {
  console.log("Server is running on port 3001");
});

//npm i nodemon -g 实时的更新js文件 不用重新启动了
